package gw.com.android.ui.me;

import android.animation.ValueAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

/**
 * 可在一定范围内进行高度拉伸的布局
 * <p>
 * 注： 如果要单独使用此布局，则需要打开setClickable(true);这段代码，或者在onTouchEvent中返回true，消耗掉 事件。
 * 目前使用场景只是用这个布局来做个标记而已( 配合 StretchHeaderListView 使用)，所以不需要它本身的拉伸特性。
 */
public class StretchyLayout extends RelativeLayout {

    public StretchyLayout(Context context) {
        this(context, null);
    }

    public StretchyLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public StretchyLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
//        setClickable(true);  //禁用此代码，来防止这个布局消耗掉点击事件。因为如果它消耗了点击事件，外层事件点击在这个布局上的时候，就无法执行onTouchEvent
    }

    int y = 0;
    int oriHeight = 0;
    int lastY;

    // 回弹完成之前，不允许再次move
    private boolean ifInAnimator = false;// 是否正在执行动画,true表示正在执行回弹动画，false表示动画已完毕

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        oriHeight = getMeasuredHeight();

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 按下，开始记录当前Y
                if (!ifInAnimator) {
                    y = (int) event.getRawY();
                    if (onScrollInterface != null)
                        onScrollInterface.setOriHeight(oriHeight);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                // 动态改变组件的高度，要设置边界
                //这里是一小段一小段的move，所以，要慢慢移动
                Log.d("distag2", "ACTION_MOVE:" + ifInAnimator);
                if (!ifInAnimator) {
                    int movedY = (int) event.getRawY();
                    oriHeight += (movedY - lastY);
                    if (onScrollInterface != null)
                        onScrollInterface.onScroll(oriHeight);
                    Log.d("distag2", "执行高度变化:" + ifInAnimator);
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                // 松开，记录当前Y，算出滑动的距离
                int upY = (int) event.getRawY();
                int dis = upY - y;
                Log.d("distag", "ACTION_UP: 这次拉伸的长度是:" + dis + "-" + (event.getAction() == MotionEvent.ACTION_CANCEL));
                //松开的时候，根据当前需要回弹的距离，进行缓慢回弹
                //用动画吧
                int start = oriHeight;
                final int end = oriHeight - dis;
                ValueAnimator valueAnimator = ValueAnimator.ofFloat(start, end);
                valueAnimator.setDuration(500);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float current = (float) animation.getAnimatedValue();
                        if (onScrollInterface != null)
                            onScrollInterface.onScroll(current);
                        if (current == end)
                            ifInAnimator = false;
                    }
                });
                valueAnimator.start();
                ifInAnimator = true;
                break;
        }
        lastY = (int) event.getRawY();
//        return true;
        return super.onTouchEvent(event);
    }

    private OnScrollInterface onScrollInterface;

    public void setOnScrollInterface(OnScrollInterface onScrollInterface) {
        this.onScrollInterface = onScrollInterface;
    }

    public interface OnScrollInterface {
        void onScroll(float targetHeight);

        void setOriHeight(int oriHeight);
    }
}
